﻿//#define _CRT_SECURE_NO_WARNINGS 1
//@[Toc](DP)
//# 1. 第N个泰波那契数（easy）
//[题目](https://leetcode.cn/problems/n-th-tribonacci-number/submissions/574860650/)
//```cpp
//class Solution {
//public:
//    int tribonacci(int n) {
//        // 1. 创建 dp 表 
//        // 2. 初始化 
//        // 3. 填表 
//        // 4. 返回结果 
//        // 处理边界情况 
//        int t0 = 0, t1 = 1, t2 = 1;
//        if (n == 0)
//            return 0;
//        if (n == 1 || n == 2)
//            return 1;
//        int t3;
//        while (n-- > 2)
//        {
//            t3 = t0 + t1 + t2;
//            t0 = t1;
//            t1 = t2;
//            t2 = t3;
//        }
//        return t3;
//    }
//};
//```
//
//# 2. 三步问题（easy）
//[题目](https://leetcode.cn/problems/three-steps-problem-lcci/description/)
//```cpp
//#define MOD 1000000007
//class Solution {
//public:
//    int waysToStep(int n) {
//        vector<int> dp(n + 1);
//        //处理边界情况，n<3的时候
//        if (n == 1 || n == 2) return n;
//        if (n == 3) return 4;
//        dp[1] = 1, dp[2] = 2, dp[3] = 4;//只有n大于1时才能对2赋值
//        for (int i = 4; i <= n; i++)
//        {
//            dp[i] = ((dp[i - 1] + dp[i - 2]) % MOD + dp[i - 3]) % MOD;
//        }
//        return dp[n];
//    }
//};
//```
//# 3. 使⽤最⼩花费爬楼梯（easy）
//[题目](https://leetcode.cn/problems/min-cost-climbing-stairs/description/)
//```cpp
//class Solution {
//public:
//    int minCostClimbingStairs(vector<int>& cost) {
//        int n = cost.size();
//        vector<int> dp(n);
//        for (int i = 2; i < n; i++)
//            dp[i] = min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]);
//        return min(dp[n - 1] + cost[n - 1], dp[n - 2] + cost[n - 2]);
//    }
//};
//```
//# 4. 解码⽅法（medium）
//[题目](https://leetcode.cn/problems/decode-ways/)
//```cpp
//class Solution {
//public:
//    int numDecodings(string s) {
//        int n = s.size();
//        vector<int> dp(n + 1);//将每一位都向后挪动一位，保障原i下标等于1可以加入到状态转移方程
//        //因为对于下标等于1的i有三种情况判断有0,1,2三种结果
//        //对应01,10,11三种结果
//        dp[0] = 1;//虚拟位，为了保证原i等于1可以双字符解码时能增加一个方法
//        dp[1] = s[1 - 1] != '0';
//        for (int i = 2; i <= n; i++)
//        {
//            if (s[i - 1] != '0')//能单字符解码
//                dp[i] += dp[i - 1];
//            int t = (s[i - 2] - '0') * 10 + (s[i - 1] - '0');
//            if (t >= 10 && t <= 26)//能双字符解码
//                dp[i] += dp[i - 2];
//        }
//        return dp[n];
//    }
//};
//```
//
//# 5. 不同路径（medium）
//[题目](https://leetcode.cn/problems/unique-paths/submissions/574891872/)
//```cpp
//class Solution {
//public:
//    int uniquePaths(int m, int n) {
//        vector<vector<int>> dp(m + 1, vector<int>(n + 1));
//        dp[0][1] = 1;
//        for (int i = 1; i < m + 1; i++)
//        {
//            for (int j = 1; j < n + 1; j++)
//                dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
//        }
//        return dp[m][n];
//    }
//};
//```